#ifndef MTMEX4_H
#define MTMEX4_H
#include <stdexcept>
#include <string>
using std::string;
namespace mtm {

class MTM_EXCEPTION: public std::exception{};
/**
 * These classes define all errors that can be thrown in the system.
 */
class INVALID_BARCODE : public MTM_EXCEPTION{};
class INVALID_PRICE : public MTM_EXCEPTION{};
class INVALID_YEAR : public MTM_EXCEPTION{};
class INVALID_NUM_PURCHASED : public MTM_EXCEPTION{};
class INVALID_ID : public MTM_EXCEPTION{};
class INVALID_ORDER_NUMBER : public MTM_EXCEPTION{};
class INVALID_NUMBER_OF_RECOMMENDATIONS : public MTM_EXCEPTION{};
class BARCODE_ALREADY_EXISTS : public MTM_EXCEPTION{};
class ORDER_DOESNT_HAVE_ALBUM : public MTM_EXCEPTION{};
class CUSTOMER_ALREADY_EXISTS : public MTM_EXCEPTION{};
class CUSTOMER_DOESNT_EXIST : public MTM_EXCEPTION{};
class ALBUM_MISSING : public MTM_EXCEPTION{};
class ORDER_ALREADY_EXISTS : public MTM_EXCEPTION{};
class CUSTOMER_HAS_OPEN_ORDER : public MTM_EXCEPTION{};
class ORDER_WAS_ALREADY_PAID : public MTM_EXCEPTION{};
class ALBUM_DOESNT_EXIST : public MTM_EXCEPTION{};
class ORDER_DOESNT_EXIST : public MTM_EXCEPTION{};
class ORDER_IS_EMPTY : public MTM_EXCEPTION{};
class EMPTY_INVENTORY : public MTM_EXCEPTION{};
class NO_CUSTOMERS : public MTM_EXCEPTION{};
class NOT_ENOUGH_RECOMMENDATIONS : public MTM_EXCEPTION{};
class ELEMENT_NOT_FOUND: public MTM_EXCEPTION{};
class NON_MATCHING_LIST: public MTM_EXCEPTION{};


/**
 * @param title - album title.
 * @param artist - artist\band name.
 * @param year - year published.
 * @param price - price of album
 *
 * @return
 * 		 a string representing a minimal album description.
 */
string getAlbumMinimalString(const string& title, const string& artist, const int& year, const int& price);

/**
 * @param ordNum - order serial number.
 * @param byWhoId - customer ID that did the order.
 * @param size - number of albums in order.
 * @param wasPaid - true if the order was paid, false otherwise.
 *
 * @return
 * 		a string representing the header for order details.
 */
string getOrderHeaderString(const int& ordNum, const int& byWhoId, const int& size, const bool& wasPaid);

/**
 * @param size - number of albums in store.
 *
 * @return
 * 		a string representing the header for the album list.
 */
string getAlbumsHeaderString(const int& size);

/**
 * @param size - number of recommendations.
 *
 * @return
 * 		a string representing the header for the recommendations.
 */
string getRecommendationsHeaderString(const int& size);


/**
 * @param id - customer ID number.
 * @param name - customer's name.
 * @param numOfAlbumsSold - number of albums owned by customer. i.e. number of albums that the customer
 * paid(!) for. You mustn't include Albums in an unpaid order.
 *
 * @return
 * 		a string representing the header for the customer's details.
 */
string getCustomerHeaderString(const int& id, const string& name, const int& numOfAlbumsSold);

/**
 * @param numOfCustomers - number of customers registered to the store.
 * @param numOfAlbumsSold - number of albums sold. i.e. number of albums that the customers
 * paid(!) for. You mustn't include Albums in an unpaid orders.
 * @param totalRevenue - total revenue for the store.
 *
 * @return
 * 		a string representing the header for the revenue details.
 */
string getRevenueHeaderString(const int& numOfCustomers,const int& numOfAlbumsSold, const int& totalRevenue);

/**
 * @param id - customer ID number.
 * @param name - customer's name.
 * @param totalNumOfDisks - number of albums owned by customer. i.e. number of albums that the
 * customer paid(!) for. You mustn't include Albums in an unpaid order.
 * @param totalRevenue - total revenue from that customer.
 *
 * @return
 * 		a string representing the customer's revenue details.
 */
string getRevenueFromCustomerString(const int& id, const string& name, const int& totalNumOfDisks, const int& totalRevenue);

/**
 * @param id - customer ID number.
 * @param name - customer's name.
 *
 * @return
 * 		a string representing a minimal description of the customer.
 */
string getCustomerDescriptionString(const int& id, const string& name);

/**
 * @param numOfCustomers - number of customers registered to the store.
 *
 * @return
 * 		a string representing the header for the customers' details.
 */
string getCustomersHeaderString(const int& numOfCustomers);


/**
 * @param barcode - album barcode number.
 * @param price - album's price.
 * @param year - album's published year.
 * @param numPurchased - the total number of purchases for that album.
 * Only paid albums are accumulated. You mustn't include Albums in an unpaid order.
 * @param title - album title.
 * @param artist - artist name.
 *
 * @return
 * 		a string representing a full album description.
 */
string getAlbumFullString(const int& barcode,const int& price,const int& year,const int& numPurchased,const string& title,const string& artist);

}

#endif /* MTMEX4_H */
